-- 在最开始添加职业判断
local _, playerClass = UnitClass("player")
if playerClass ~= "PALADIN" then
    -- 兼容中英文客户端
    return  -- 非圣骑士职业直接停止加载
end

print("haha-qs-nq插件，版本：0.0.1.20250508")

local wowWatcher = CreateFrame("Frame", "BlueSquareFrame", UIParent);-- 创建一个新的框架
wowWatcher:SetFrameLevel(1);-- 设置框架的层级
wowWatcher:SetSize(42, 5) -- 宽度和高度都是100像素 -- 设置框架的尺寸
wowWatcher:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0) -- 距离屏幕左上角10,-10的位置 -- 设置框架的位置

local colorSize = 5;

-- 1-1 道标，如果是绿色，代表焦点需要上道标，如果是红色，代表焦点不需要上道标
-- 1-2 自动上道标检测的开关，绿色打开，红色关闭
-- 1-3 圣光术，如果是绿色，代表焦点或鼠标指向目标需要
-- 1-4 圣光术开关，绿色打开自动圣光术，红色关闭圣光术
-- 1-5 圣光闪现，如果是绿色，代表焦点或鼠标指向目标需要

-- 1-1 道标，如果是绿色，代表焦点需要上道标，如果是红色，代表焦点不需要上道标
local db_wl_green = wowWatcher:CreateTexture(nil, "BACKGROUND")
db_wl_green:SetColorTexture(0, 1, 0, 1)
db_wl_green:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 0, 0); -- 使纹理填充整个框架
db_wl_green:SetSize(colorSize, colorSize);
db_wl_green:SetAlpha(0);
-- 蓝色纹理，当没有邪甲术的时候就是红色的纹理
local db_wl_red = wowWatcher:CreateTexture(nil, "BACKGROUND")--创建纹理
db_wl_red:SetColorTexture(1, 0, 0, 1)
db_wl_red:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 0, 0);--设置框架相对锚点
db_wl_red:SetSize(colorSize, colorSize)
db_wl_red:SetAlpha(1)

-- 间隔纹理
local splitTexture1 = wowWatcher:CreateTexture(nil, "BACKGROUND")
splitTexture1:SetColorTexture(0.5, 0.5, 0.5, 1)
splitTexture1:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 5, 0); -- 使纹理填充整个框架
splitTexture1:SetSize(1, colorSize);
splitTexture1:SetAlpha(1);

-- 1-2 自动上道标检测的开关，绿色打开，红色关闭
local db_switch_wl_green = wowWatcher:CreateTexture(nil, "BACKGROUND")
db_switch_wl_green:SetColorTexture(0, 1, 0, 1)
db_switch_wl_green:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 6, 0); -- 使纹理填充整个框架
db_switch_wl_green:SetSize(colorSize, colorSize);
db_switch_wl_green:SetAlpha(0);

local db_switch_wl_red = wowWatcher:CreateTexture(nil, "BACKGROUND")--创建纹理
db_switch_wl_red:SetColorTexture(1, 0, 0, 1)
db_switch_wl_red:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 6, 0);--设置框架相对锚点
db_switch_wl_red:SetSize(colorSize, colorSize)
db_switch_wl_red:SetAlpha(1)

-- 间隔纹理
local splitTexture2 = wowWatcher:CreateTexture(nil, "BACKGROUND")
splitTexture2:SetColorTexture(0.5, 0.5, 0.5, 1)
splitTexture2:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 11, 0); -- 使纹理填充整个框架
splitTexture2:SetSize(1, colorSize);
splitTexture2:SetAlpha(1);

-- 1-3 圣光术，如果是绿色，代表焦点或鼠标指向目标需要
local sgs_wl_green = wowWatcher:CreateTexture(nil, "BACKGROUND")
sgs_wl_green:SetColorTexture(0, 1, 0, 1)
sgs_wl_green:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 12, 0); -- 使纹理填充整个框架
sgs_wl_green:SetSize(colorSize, colorSize);
sgs_wl_green:SetAlpha(0);

local sgs_wl_red = wowWatcher:CreateTexture(nil, "BACKGROUND")--创建纹理
sgs_wl_red:SetColorTexture(1, 0, 0, 1)
sgs_wl_red:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 12, 0);--设置框架相对锚点
sgs_wl_red:SetSize(colorSize, colorSize)
sgs_wl_red:SetAlpha(1)

-- 间隔纹理
local splitTexture3 = wowWatcher:CreateTexture(nil, "BACKGROUND")
splitTexture3:SetColorTexture(0.5, 0.5, 0.5, 1)
splitTexture3:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 17, 0); -- 使纹理填充整个框架
splitTexture3:SetSize(1, colorSize);
splitTexture3:SetAlpha(1);

-- 1-4 圣光术开关，绿色打开自动圣光术，红色关闭圣光术
local sgs_switch_wl_green = wowWatcher:CreateTexture(nil, "BACKGROUND")
sgs_switch_wl_green:SetColorTexture(0, 1, 0, 1)
sgs_switch_wl_green:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 18, 0); -- 使纹理填充整个框架
sgs_switch_wl_green:SetSize(colorSize, colorSize);
sgs_switch_wl_green:SetAlpha(0);

local sgs_switch_wl_red = wowWatcher:CreateTexture(nil, "BACKGROUND")--创建纹理
sgs_switch_wl_red:SetColorTexture(1, 0, 0, 1)
sgs_switch_wl_red:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 18, 0);--设置框架相对锚点
sgs_switch_wl_red:SetSize(colorSize, colorSize)
sgs_switch_wl_red:SetAlpha(1)

-- 间隔纹理
local splitTexture4 = wowWatcher:CreateTexture(nil, "BACKGROUND")
splitTexture4:SetColorTexture(0.5, 0.5, 0.5, 1)
splitTexture4:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 23, 0); -- 使纹理填充整个框架
splitTexture4:SetSize(1, colorSize);
splitTexture4:SetAlpha(1);

-- 1-5 圣光闪现，如果是绿色，代表焦点或鼠标指向目标需要
local sgsx_wl_green = wowWatcher:CreateTexture(nil, "BACKGROUND")
sgsx_wl_green:SetColorTexture(0, 1, 0, 1)
sgsx_wl_green:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 24, 0); -- 使纹理填充整个框架
sgsx_wl_green:SetSize(colorSize, colorSize);
sgsx_wl_green:SetAlpha(0);

local sgsx_wl_red = wowWatcher:CreateTexture(nil, "BACKGROUND")--创建纹理
sgsx_wl_red:SetColorTexture(1, 0, 0, 1)
sgsx_wl_red:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 24, 0);--设置框架相对锚点
sgsx_wl_red:SetSize(colorSize, colorSize)
sgsx_wl_red:SetAlpha(1)

-- 间隔纹理
local splitTexture5 = wowWatcher:CreateTexture(nil, "BACKGROUND")
splitTexture5:SetColorTexture(0.5, 0.5, 0.5, 1)
splitTexture5:SetPoint("TOPLEFT", wowWatcher, "TOPLEFT", 29, 0); -- 使纹理填充整个框架
splitTexture5:SetSize(1, colorSize);
splitTexture5:SetAlpha(1);

-- 原dragFrame仅用于祝福提示
local dragFrame = CreateFrame("Frame", nil, UIParent)
dragFrame:SetSize(105, 35)  -- 3个图标总宽35 * 3=105
dragFrame:SetPoint("CENTER", healFrame, "CENTER", 0, -150)  -- 位于治疗图标下方

-- 创建水之护盾开关按钮 --
local sgsButton = CreateFrame("Button", nil, UIParent) -- 创建按钮框架
sgsButton:SetSize(30, 30) -- 设置按钮大小
sgsButton:SetPoint("TOP", UIParent, "CENTER", 100, -150) -- 定位到屏幕中心下方
sgsButton:RegisterForClicks("AnyUp") -- 注册接受所有点击事件

-- 创建按钮纹理 --
local shsIcon = sgsButton:CreateTexture(nil, "BACKGROUND") -- 创建纹理对象
shsIcon:SetAllPoints() -- 纹理填满整个按钮
shsIcon:SetTexture("Interface\\Icons\\Spell_Holy_HolyBolt")  -- 替换为圣光术图标
shsIcon:SetAlpha(0.5) -- 初始半透明状态

-- 创建开关状态变量 --
local szhdEnabled = false -- 开关状态变量（默认关闭）
-- 是否正在施放圣光术的标志
local castSgs = false;
-- 是否正在施放圣闪现的标志
local castSgsx = false;
-- 圣光术的技能id
local sgsSpellId = 48781;
-- 圣光闪现技能id
local sgsxSpellId = 48784;

-- 点击事件处理 --
sgsButton:SetScript("OnClick", function(self, button)
    szhdEnabled = not szhdEnabled -- 切换开关状态
    PlaySound(szhdEnabled and 856 or 857) -- 播放音效（开启：856，关闭：857）

    -- 更新图标显示状态
    if szhdEnabled then
        shsIcon:SetAlpha(1) -- 完全可见
        shsIcon:SetDesaturated(false) -- 正常颜色
        sgs_switch_wl_red:SetAlpha(0);
        sgs_switch_wl_green:SetAlpha(1);
    else
        shsIcon:SetAlpha(0.5) -- 半透明
        shsIcon:SetDesaturated(true) -- 去饱和度（黑白效果）
        sgs_switch_wl_red:SetAlpha(1);
        sgs_switch_wl_green:SetAlpha(0);
    end
end)

-- 鼠标提示 --
sgsButton:SetScript("OnEnter", function(self)
    GameTooltip:SetOwner(self, "ANCHOR_RIGHT") -- 设置提示框位置
    GameTooltip:AddLine("圣光术自动施放") -- 标题
    GameTooltip:AddLine("状态：" .. (szhdEnabled and "|cFF00FF00开启|r" or "|cFFFF0000关闭|r"), 1, 1, 1) -- 状态显示
    GameTooltip:AddLine("点击切换开关", 0.6, 0.6, 0.6) -- 操作提示
    GameTooltip:Show() -- 显示提示框
end)

sgsButton:SetScript("OnLeave", function()
    GameTooltip:Hide() -- 隐藏提示框
end)

-- 配置数据 --
local BLESSING_INFO = {
    ["智慧祝福"] = {
        icon = "Interface\\Icons\\Spell_Holy_SealOfWisdom",
        spellIDs = { 19852, 19853, 25894, 25290, 27142, 27143, 48935, 48937, 48936, 48938 }, -- 普通+强效智慧祝福
        checkFunc = function()
            return GetSpellInfo(19852)  -- 返回基础法术名称
        end
    },
    ["力量祝福"] = {
        icon = "Interface\\Icons\\Spell_Holy_FistOfJustice",
        spellIDs = { 19836, 25782, 25291, 25916, 27140, 27141, 48933, 48931 }, -- 普通+强效力量祝福
        checkFunc = function()
            return GetSpellInfo(19836)
        end
    },
    ["王者祝福"] = {
        icon = "Interface\\Icons\\Spell_Magic_GreaterBlessingofKings",
        spellIDs = { 20217, 25898 }, -- 普通+强效王者祝福
        checkFunc = function()
            return GetSpellInfo(20217)
        end
    }
}

-- 图标池管理 --
local blessingIcons = {}
for i, blessName in ipairs({ "王者祝福", "智慧祝福", "力量祝福" }) do
    local icon = dragFrame:CreateTexture(nil, "OVERLAY")
    icon:SetSize(30, 30)
    icon:SetPoint("LEFT", dragFrame, "LEFT", (i - 1) * 35, 0)
    icon:SetTexture(BLESSING_INFO[blessName].icon)
    icon:Hide()
    blessingIcons[blessName] = icon
end

-- 在文件开头添加战斗状态变量
local inCombat = false
-- 创建战斗状态检测框架
local combatFrame = CreateFrame("Frame")
combatFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
combatFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
combatFrame:SetScript("OnEvent", function(self, event)
    inCombat = (event == "PLAYER_REGEN_DISABLED")

    -- 非战斗时重置所有指示器
    if not inCombat then
        db_wl_red:SetAlpha(1)
        db_wl_green:SetAlpha(0)
        sgs_wl_red:SetAlpha(1)
        sgs_wl_green:SetAlpha(0)
        sgsx_wl_red:SetAlpha(1)
        sgsx_wl_green:SetAlpha(0)
    end
end)

local dbSwitch = false;

function startOrCloseDb()
    if dbSwitch then
        print("自动道标关闭...")
        dbSwitch = false;
        db_switch_wl_red:SetAlpha(1);
        db_switch_wl_green:SetAlpha(0);
    else
        print("自动道标打开...")
        dbSwitch = true;
        db_switch_wl_red:SetAlpha(0);
        db_switch_wl_green:SetAlpha(1);
    end
end

-- 用于检测是否需要补道标
function checkDb()
    -- 首先判断当前是否有焦点
    if not UnitExists("focus") then
        -- 不存在焦点设置施放道标的色块为红色
        db_wl_red:SetAlpha(1);
        db_wl_green:SetAlpha(0);
        return
    end

    local name, _, _, _, _, expirationTime = AuraUtil.FindAuraByName("圣光道标", "focus", "PLAYER|HELPFUL")
    if name then
        if (expirationTime - GetTime()) > 10 then
            db_wl_red:SetAlpha(1);
            db_wl_green:SetAlpha(0);
        else
            db_wl_red:SetAlpha(0);
            db_wl_green:SetAlpha(1);
        end
    else
        db_wl_red:SetAlpha(0);
        db_wl_green:SetAlpha(1);
    end
end

-- 改进的祝福检测 --
local function CheckBlessings()
    if not UnitExists("target") or not UnitIsPlayer("target") then
        return {}
    end

    local playerBlessing = false  -- 玩家是否已施加任何祝福
    local appliedBlessings = {}  -- 记录已存在的祝福类型

    -- 第一步：检测所有已应用的祝福
    for i = 1, 40 do
        local name, _, _, _, _, _, source, _, _, spellId = UnitAura("target", i, "HELPFUL")
        if not name then
            break
        end

        -- 检查是否属于任意祝福类型
        for blessType, info in pairs(BLESSING_INFO) do
            if tContains(info.spellIDs, spellId) then
                appliedBlessings[blessType] = true
                if source == "player" then
                    -- 直接判断来源单位
                    playerBlessing = true
                end
            end
        end
    end

    -- 第二步：根据玩家施加状态决定显示逻辑
    if playerBlessing then
        return {}  -- 玩家已施加过任意祝福，不显示任何图标
    else
        -- 仅显示缺失的祝福
        local missing = {}
        for blessType, _ in pairs(BLESSING_INFO) do
            if not appliedBlessings[blessType] then
                table.insert(missing, blessType)
            end
        end
        return missing
    end
end

-- 更新界面逻辑 --
local function UpdateUI()
    -- 隐藏所有祝福图标
    for _, icon in pairs(blessingIcons) do
        icon:Hide()
    end

    -- 检测缺失祝福（原逻辑不变）
    local missing = CheckBlessings()
    if #missing > 0 then
        -- 仅更新祝福图标位置
        for i, blessName in ipairs(missing) do
            local icon = blessingIcons[blessName]
            icon:ClearAllPoints()
            icon:SetPoint("LEFT", dragFrame, "LEFT", (i - 1) * 35, 0)
            icon:Show()
        end
        dragFrame:SetWidth(#missing * 35)
    else
        dragFrame:SetWidth(1)
    end
end

-- 动态获取圣光术基础治疗值的函数
local function GetBaseHeal(spellId)
    -- 获取圣光术描述文本（WLK版本ID：27136）
    local description = GetSpellDescription(spellId)

    -- 使用正则表达式解析治疗量范围（适配多语言）
    local minHeal, maxHeal = string.match(description, "(%d+)[^%d]-(%d+)")

    -- 返回解析结果或默认值
    return minHeal and tonumber(minHeal) or 3164,
    maxHeal and tonumber(maxHeal) or 3523
end

function checkSgs()
    -- 如果鼠标指向是死的，就不检测了
    if UnitIsDeadOrGhost("mouseover") then
        return ;
    end

    if UnitCanAttack("player", "mouseover") then
        return ;
    end

    -- 动态获取基础治疗值
    local sgsMinHeal, sgsMaxHeal = GetBaseHeal(sgsSpellId)
    local sgsxMinHeal, sgsxMaxHeal = GetBaseHeal(sgsxSpellId)

    -- 先获取鼠标指向目标的血量
    local mouseCurrentHealth = UnitHealth('mouseover')
    local mouseMaxHealth = UnitHealthMax('mouseover')
    local mouseDamageHealth = mouseMaxHealth - mouseCurrentHealth;
    local spellDmg = GetSpellBonusHealing();
    -- 最后的0.8是估算的一个系数，因为不能等到人家扣到这么多血再去治疗就晚了，所以需要稍微有一点提前量
    local finalMinSgsHeal = (sgsMinHeal + spellDmg) * 1.12 * 1.05 * 0.8;
    local finalMinSgsxHeal = (sgsxMinHeal + spellDmg) * 1.12 * 1.05 * 0.8;
    local focusCurrentHealth = UnitHealth('focus')
    local focusMaxHealth = UnitHealthMax('focus')
    local focusDamageHealth = focusMaxHealth - focusCurrentHealth;

    -- 如果正在施放圣光术，那么就把掉血的量扣除预计加血量，然后做一个兼容等于0
    if castSgs then
        mouseDamageHealth = mouseDamageHealth - finalMinSgsHeal;
        if mouseDamageHealth < 0 then
            mouseDamageHealth = 0;
        end
        focusDamageHealth = focusDamageHealth - finalMinSgsHeal;
        if focusDamageHealth < 0 then
            focusDamageHealth = 0;
        end
    end

    -- 如果鼠标指向的目标的掉血的量大于圣光术的预计最小值，那么就应该加血
    if mouseDamageHealth > finalMinSgsHeal then
        sgs_wl_red:SetAlpha(0);
        sgs_wl_green:SetAlpha(1);
    else
        -- 否则需要看一下焦点，如果焦点掉血的值大于圣光术的预计最小值，那么就加圣光术
        if focusDamageHealth > finalMinSgsHeal then
            sgs_wl_red:SetAlpha(0);
            sgs_wl_green:SetAlpha(1);
        else
            sgs_wl_red:SetAlpha(1);
            sgs_wl_green:SetAlpha(0);
        end
    end

    -- 如果正在施放圣光闪现，就把扣血的值减去正在加血的圣光闪现的预计加血值，然后再做判断
    if castSgsx then
        mouseDamageHealth = mouseDamageHealth - finalMinSgsxHeal;
        if mouseDamageHealth < 0 then
            mouseDamageHealth = 0;
        end
        focusDamageHealth = focusDamageHealth - finalMinSgsxHeal;
        if focusDamageHealth < 0 then
            focusDamageHealth = 0;
        end
    end

    -- 如果鼠标指向的目标的掉血量大于预计圣光闪现的加血值，就设置为绿色
    if mouseDamageHealth > finalMinSgsxHeal then
        sgsx_wl_red:SetAlpha(0);
        sgsx_wl_green:SetAlpha(1);
    else
        -- 否则就去检查焦点
        if focusDamageHealth > finalMinSgsxHeal then
            sgsx_wl_red:SetAlpha(0);
            sgsx_wl_green:SetAlpha(1);
        else
            sgsx_wl_red:SetAlpha(1);
            sgsx_wl_green:SetAlpha(0);
        end
    end
end

-- 事件区
wowWatcher:SetScript("OnUpdate", function()
    -- 检测当前目标的祝福
    UpdateUI();

    if not inCombat then
        return
    end  -- 非战斗状态不处理
    checkDb();
    checkSgs();
end);

---- 监视单位施法开始事件 START
local function unitSpellCastStartOnEvent(self, event, unitTarget, castGUID, spellID)
    if unitTarget ~= 'player' then
        return ;
    end

    -- 如果施放的是圣光术，那么就加个正在施法的标志
    if spellID and spellID == sgsSpellId then
        castSgs = true;
    end
    if spellID and spellID == sgsxSpellId then
        castSgsx = true;
    end
end

local unitSpellCastStartOnEventFrame = CreateFrame("Frame");
unitSpellCastStartOnEventFrame:RegisterEvent("UNIT_SPELLCAST_START");
unitSpellCastStartOnEventFrame:SetScript("OnEvent", unitSpellCastStartOnEvent);

-- 监视单位施法成功事件 START
local function unitSpellCastSucceededOnEvent(self, event, unitTarget, castGUID, spellID)
    if unitTarget ~= 'player' then
        return ;
    end
    -- 如果施放成功就解除
    if spellID and spellID == sgsSpellId then
        castSgs = false;
    end
    -- 如果施放成功就解除
    if spellID and spellID == sgsxSpellId then
        castSgsx = false;
    end

end
local unitSpellCastSucceededOnEventFrame = CreateFrame("Frame");
unitSpellCastSucceededOnEventFrame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED");
unitSpellCastSucceededOnEventFrame:SetScript("OnEvent", unitSpellCastSucceededOnEvent);
-- 监视单位施法成功事件 END

-- 监视单位施法停止事件 START UNIT_SPELLCAST_STOP
local function unitSpellCastStopOnEvent(self, event, unitTarget, castGUID, spellID)
    if unitTarget ~= 'player' then
        return ;
    end
    -- 如果施放成功就解除
    if spellID and spellID == sgsSpellId then
        castSgs = false;
    end
    -- 如果施放成功就解除
    if spellID and spellID == sgsxSpellId then
        castSgsx = false;
    end
end

local unitSpellCastStopOnEventFrame = CreateFrame("Frame");
unitSpellCastStopOnEventFrame:RegisterEvent("UNIT_SPELLCAST_STOP");
unitSpellCastStopOnEventFrame:SetScript("OnEvent", unitSpellCastStopOnEvent);
-- 监视单位施法停止事件 END
